KAPITOLA 2
DATOVÉ TYPY A STRUKTURY
Prozatím jsme v R pracovali pouze s vektory. Vyzkoušeli jsme si, jak je tvořit a jak s nimi dále pracovat. Současně jsme se též seznámili s prostředím RStudia, ve kterém se budeme po celou dobu studia pohybovat.
S vektory si však příliš velkou zábavu neužijeme, a proto se v této kapitole seznámíme i s dalšími formáty dat, zejména s data frame a maticemi. Tím se dostáváme k tématu datových typů a datových struktur, jimž bude věnována severoamerická část cesty.
Stejně jako můžeme v New Yorku nalézt pět hlavních čtvrtí, lze i v R nalézt pět základních datových typů. Jedná se o integer, numeric, complex, character a logical. Ve své podstatě se jedná o to, že datový typ charakterizuje formát dat (čímž máme na mysli čísla, písmena atd.), ze kterého se příslušný vektor (či proměnná databáze) skládá. První vektor, který si tu představíme, ponese hodnoty od mínus jedné do pěti.
x <- -1:5 # vzorový vektor
class(x) # pomocí příkazu class() zjistíme datový typ [1] -1 0 1 2 3 4 5
[1] "integer"
V R se můžeme setkat se třemi číselnými datovými typy. Tím prvním je integer, který označuje celá čísla (např. -2, -1, 0, 1, 2 a podobně). Ne vždy ale budeme pracovat s hodnotami bez desetinných míst, proto nám R nabízí i datový typ numeric. Ten obsahuje veškerá reálná čísla, mezi která patří nejenom ta, jež můžeme zapsat pomocí zlomku (racionální čísla), ale i čísla iracionální jako např. pí. Chcete-li se mimochodem o pí dozvědět více a myslíte si přitom, že matematikům nikdy rozumět nebudete, podívejte se na toto video a jistě změníte svůj názor.
x <- seq(from = 1, to = 3, by = 1/3) + pi # vzorový vektor
class(x)[1] 4.141593 4.474926 4.808259 5.141593 5.474926 5.808259 6.141593
[1] "numeric"
Posledním číselným datovým typem je complex. Ten bude použit tehdy, je-li ve vektoru uvedeno komplexní číslo. S ním však v našem kurzu pracovat nebudeme. Přesto je dobré alespoň vědět, že tento datový typ existuje.
x <- c(1+2i, 3.14)
class(x)[1] 1.00+2i 3.14+0i
[1] "complex"
Čtvrtým datovým typem je character. S ním už jsme se obdobně jako s numeric setkali již v předchozí kapitole.
x <- c("ČR", "SR", "VB", "NSR") # vzorový vektor
# u slov a písmen nikdy nezapomínejte na uvozovky či apostrofy
class(x)[1] "ČR" "SR" "VB" "NSR"
[1] "character"
Co když se ale vektor skládá jak z písmen, tak i číslic? Na tuto otázku už bychom měli být schopni správně odpovědět na základě znalostí z předchozí kapitoly.
x <- c(1, 5, "ano", "ne") # vzorový vektor[1] "1" "5" "ano" "ne"
[1] "character"
Vektor se stane opět textovým (tj. character), i když obsahuje, byť jen jedno písmeno. Čísla proto též obdrží formát textových popisků pomocí uvozovek, jak to lze vidět u předchozího výstupu.
Posledním datovým typem je logical, který nabývá hodnot TRUE a FALSE (či jen zkráceně T a F).
x <- c("TRUE", "FALSE", "TRUE") # vzorový vektor
class(x)[1] "TRUE" "FALSE" "TRUE"
[1] "character"
Ptáte se, kde se stala chyba? Vektor x obsahuje slova uvedená v uvozovkách, proto ho R vyhodnotil jako character. V takovém případě se může občas stát, vyžaduje-li to například určitý příkaz, že budeme muset datový typ změnit (na takové příkazy budete vždy včas upozorněni). Toho docílíme pomocí příkazu, který je uveden níže.
x <- c("TRUE", "FALSE", "TRUE") # vzorový vektor
x <- as.logical(x) # změna na datový typ logical
class(x)
# Pokud bychom chtěli rovnou vytvořit logický vektor,
# odstranili bychom uvozovky.
# x <- c(TRUE, FALSE, TRUE)[1] TRUE FALSE TRUE
[1] "logical"
Princip změny datového typu je velice prostý. Vlevo od zobáčku uvedeme název budoucí proměnné (jak vidíte, může být nezměněn, tj. stále x) a vpravo zapíšeme příkaz as.logical (popřípadě numeric, integer, complex nebo character) plus do závorky připojíme název proměnné, u které datový typ měníme.
Co však nastane v případě, bude-li vektor obsahovat pouze hodnoty jako například muž a žena či různá hodnocení jako skvělý, průměrný, nepoužitelný? Bude mít tvar logical nebo character? Překvapím vás. Nejvhodnější pro naši práci bude speciální datový typ s názvem faktor, který si představíme ve třetí lekci. Ten se totiž používá právě pro práci s kategoriálními proměnnými. Ani datový typ character však nemusíte nijak zavrhovat, protože i ten by nám u těchto hodnot ve většině případů posloužil stejně dobře jako faktor. Pouze typ logical by nám příliš nepomohl, jelikož může obsahovat pouze hodnoty TRUE a FALSE (respektive T a F).
Příklad 1
Vytvořte vektor s hodnotami od jedné do sta a zjistěte jeho datový typ. Následně v této proměnné změňte hodnotu na 51. pozici za číslo 51,01. Poté opět zjistěte datový typ proměnné.
Příklad 2
Vytvořte vektor ve tvaru -10, -9,5, -9 … 10, jehož čísla se v tomto pořadí zopakují pětkrát. Jaký datový typ bude nabývat tato proměnná?
Příklad 3
Vytvořte náhodný vektor, který bude obsahovat sto hodnot Jakub a David a následně zjistěte jeho datový typ.
Příklad 4
Vytvořte vektor ve tvaru -100, -98, -96 … 100 a změňte jeho datový typ na character. Po této změně zkuste tento vektor vynásobit číslem dvě. Je to možné?
Seznámení s datovými strukturami
Data, která bývají předmětem zkoumání, povětšinou nejsou tvořena pouze volně stojícími hodnotami či vektory, jelikož obvykle obsahují různé proměnné (rozumějte sloupce hodnot). V R nalezneme pět hlavních datových struktur, obdobně jako datových typů. Liší se jak svou homogenitou (homogenní = všechny proměnné datového souboru mají stejný datový typ, heterogenní = proměnné databáze se skládají z různých datových typů), tak i počtem dimenzí (tj. zdali datová struktura obsahuje řádky, sloupce či ještě jednu dimenzi navíc).
V nadcházejících kapitolách budeme pracovat v drtivé většině s datovou tabulkou (data frame) a vektory, v nepatrné části s maticemi a listy. S poli zde pracovat prakticky nebudeme. Proto se alespoň v následujícím přehledu podívejme, jak tato datová struktura vypadá. Začněme však postupně, a to datovou strukturou, kterou již všichni důvěrně známe.
Vektor obsahuje vždy pouze jeden datový typ, jednu dimenzi, tj. jeden sloupec (řádek) s hodnotami.
x <- c("vektor", "obsahuje", "jednu", "dimenzi", "hodnot")[1] "vektor" "obsahuje" "jednu" "dimenzi" "hodnot"
Matice jistě znáte z matematiky. V R však může taková matice obsahovat nejenom číslice, ale i další datové typy, jako character či logical. V každém případě obsahuje vždy pouze jeden datový typ a na rozdíl od vektorů je tvořena řádky a sloupci (tj. dvěma dimenzemi hodnot).
x <- matrix(c(1, 2, 3, 4, 5, 6, 7, 8, 9), nrow = 3, byrow = TRUE)
# nebo jednodušeji: x <- matrix(c(1:9), nrow = 3, byrow = TRUE)
y <- matrix(c("a","b","c","d", "e","f","g","h","ch"), nrow = 3, byrow = TRUE) [,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
[,1] [,2] [,3]
[1,] "a" "b" "c"
[2,] "d" "e" "f"
[3,] "g" "h" "ch"
Pole jsou velice podobná maticím s tím rozdílem, že na rozdíl od matic obsahují tři dimenze. Jak ale taková třetí dimenze může vypadat? Nehledejte žádné sci-fi. Stačí se podívat na následující příkaz.
x <- array(1:18, dim = c(3, 3, 2)), , 1
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
, , 2
[,1] [,2] [,3]
[1,] 10 13 16
[2,] 11 14 17
[3,] 12 15 18
Seznam je nejkomplexnější formou z datových struktur. Představte si ho jako vektor, jehož hodnoty jsou představovány složkami, do kterých můžeme vložit třeba matici, vektor, datovou tabulku či dokonce seznam samotný. Jednotlivé složky mohou být různě obsáhlé, a dokonce i pojmenované.
x <- list(vektor = c("Leden", "Únor", "Březen"),
matice = matrix(c(3, 9, 5, 1, -2, 8), nrow = 2),
pole = array(1:18, dim = c(3, 3, 2)),
list = list(vektor = c("Leden", "Únor", "Březen")))$vektor
[1] "Leden" "Únor" "Březen"
$matice
[,1] [,2] [,3]
[1,] 3 5 -2
[2,] 9 1 8
$pole
, , 1
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
, , 2
[,1] [,2] [,3]
[1,] 10 13 16
[2,] 11 14 17
[3,] 12 15 18
$list
$list$vektor
[1] "Leden" "Únor" "Březen"
Data frame (tento anglický výraz budeme využívat častěji než český ekvivalent datová tabulka) je spolu s vektory bezpochyby nejdůležitější datovou strukturou v R. Obsahuje dvě dimenze hodnot (řádky a sloupce) a jeden či více datových typů, které se mohou lišit mezi jednotlivými sloupci (proměnnými databázemi). V určitém slova smyslu by šlo říct, že datová tabulka je soubor několika vektorů (jednoho či více), které mají stejnou délku a povětšinou rozdílné datové typy. V případě nestejné délky by šlo o seznam (list). Z tohoto důvodu lze data frame popsat i jako speciální případ seznamu.
zaměstnanci <- data.frame(
ID = c (1:5),
jméno = c("Jakub", "David", "Věra", "Petr", "Anna"),
kancelář = c(642, 535, 681, 739, 925),
nástup = as.Date(
c("2013-02-04", "2017-06-21", "2012-11-14",
"2018-05-19", "2016-03-25"))) ID jméno kancelář nástup
1 1 Jakub 642 2013-02-04
2 2 David 535 2017-06-21
3 3 Věra 681 2012-11-14
4 4 Petr 739 2018-05-19
5 5 Anna 925 2016-03-25
V data frame s názvem zaměstnanci byl použit jeden speciální datový typ, se kterým jsme se ještě neseznámili. Jedná se o čas. Na jeho bližší představení si však ještě chvíli počkejme. Budeme se mu totiž pečlivě věnovat v páté kapitole, jež je věnována tvorbě grafů.
Načítání dat do RSTUDIA
Abychom si nějaký pořádný data frame mohli ukázat, musíme se nejdříve naučit, jak jej v RStudiu otevřít. Nejprve si však na svůj počítač uložte excelový soubor s názvem Katan, který obsahuje údaje ze statistického průzkumu tykající se hry Osadníci z Katanu. Osadníci z Katanu jsou deskovou hrou pro 3-4 hráče, ve které osidlujete ostrov s názvem Katan, stavíte silnice, vesnice, města a mnoho dalšího. V samotné databázi naleznete 200 řádků pozorování (200 respondentů) pro celkově devět proměnných.
Máte-li už databázi uloženou na svém PC, podívejte se do pravého horního panelu, v němž uvidíte záložku Import Dataset. Klikněte na ni a z nabídky zvolte From Excel.
Nejdříve se vám automaticky do RStudia nainstaluje rozšiřující balíček readxl, jehož instalace potrvá pouze několik sekund. Poté budete moci skrze tuto volbu již bez problému načítat jakékoli excelové soubory z vašeho počítače (soubory jako txt, csv šlo v Import Dataset načítat i bez balíčku readxl). Postup bude velice jednoduchý. Nejdříve vyberete požadovaný excelový soubor (políčko Browse), následně vlevo vyberete požadovaný list v položce Sheet (defaultně nastaveno na ten první, viz červený obdélník na obrázku) a konečně v závěru kliknete na Import.
View(Katan)
# Seznamme se s proměnnými databáze Katan.
# Partie: označuje počet sehraných partií deskové hry
# Osadníci z Katanu za měsíc
# Věk: označuje věk hráče Osadníků, který se zapojil do průzkumu
# Pohlaví: označuje pohlaví jedince
# Vzdělání: ZŠ znamená, že jedinec stále chodí do základní školy,
# nebo že je ZŠ jeho nejvyšším dosaženým vzděláním;
# SŠ znamená, že SŠ je jeho nejvyšším dosaženým vzděláním;
# Bc - VŠ znamená, že jedinec má bakalářský titul;
# VŠ znamená, že jedinec má magisterský titul
# Kolej: označuje, zdali člověk bydlí na VŠ koleji
# Práce: označuje, zdali člověk chodí pravidelně do práce
# (0,25 úvazku a více)
# Kouření: označuje pravidelné kouření
# Klub: označuje, jestli daný jedinec alespoň jednou měsíčně chodí
# do klubu deskových her
# Děti: označuje počet dětí# A tibble: 200 x 9
Partie Věk Pohlaví Vzdělání Kolej Práce Kouření Klub Děti
<dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <dbl>
1 4 13 žena ZŠ ne nepracuje nekouří nečlen 0
2 4 13 žena ZŠ ne nepracuje nekouří nečlen 0
3 3 14 muž ZŠ ne nepracuje nekouří člen 0
4 8 14 muž ZŠ ne nepracuje nekouří nečlen 0
5 5 15 muž ZŠ ne nepracuje nekouří člen 0
6 6 15 muž ZŠ ne nepracuje nekouří člen 0
7 6 15 muž ZŠ ne nepracuje nekouří člen 0
8 3 15 žena ZŠ ne nepracuje nekouří člen 0
9 3 15 žena ZŠ ne nepracuje nekouří člen 0
10 9 15 žena ZŠ ne nepracuje nekouří nečlen 0
# ... with 190 more rows
Data lze do R načítat i za pomoci konzole. Ostatně po načtení xlsx souboru v RStudiu pomocí volby Import Dataset (From Excel) se do ní podívejte. Uvidíte v ní dva nové příkazy, které za Vás RStudio automaticky zapsalo (viz též předchozí obrázek a sekce Code Preview vpravo dole).
library(readxl)
# Nejdříve je nutné načíst balíček readxl.
# Balíček je nutné načíst vždy po každém spuštění RStudia
# za předpokladu, chcete-li načítat data zápisem příkazu
# do konzole, a nikoliv přes Import Dataset.
# Více o balíčcích v páté kapitole.
Katan <- read_excel("C:/Users/.../Katan.xlsx")
# Následně použijte příkaz read_excel z balíčku readxl
# a uveďte do něj přesnou cestu k dokumentu.Při načítání datového souboru v okně s názvem Import Excel Data se nezapomeňte podívat na názvy jednotlivých proměnných. Vpravo od nich totiž naleznete drobné zobáčky, pomocí kterých lze změnit jejich datové typy (viz obrázek). Ty je samozřejmě možné měnit i později (viz modrý box v další části této lekce), v této chvíli je to však nejrychlejší. Na dolním obrázku vás možná ještě překvapí datový typ double uvedený u numerických proměnných (např. Partie, Věk, Děti). S ním si ale žádnou hlavu nedělejte a mějte ho jednoduše za numeric. Není mezi nimi totiž žádný rozdíl.
Zjišťování datové struktury proměnných
Po načtení databáze Katan došlo v R k drobné změně. Doposud jsme v pravém horním panelu viděli pouze sekci values, pod kterou jsme měli zobrazeny všechny doposud vytvořené vektorové proměnné. S načtením data frame Katan (či vytvořením matice, seznamu nebo pole) se nám zde ale objevila nová sekce data. Ta funguje zcela obdobně jako sekce values a ukazuje nám veškeré vícerozměrné proměnné.
Jak ale zjistíme, jakou datovou strukturu (neplést s datovým typem) daná proměnná obsahuje? Opět budeme muset využít příkaz class(). Vezměme si kupříkladu, že pracujeme s databází Katan a napíšeme tento příkaz.
class(Katan)[1] "tbl_df" "tbl" "data.frame"
Logika funkce class() je následující. Pokud se ptáme na vektor (nebo na proměnnou v rámci data frame, např. na Věk v databázi Katan), vrátí nám class() datový typ (numeric, character atd.). V případě, že se ptáme na vícerozměrnou proměnnou typu matice, data frame, seznam či pole, vrátí nám příkaz class() název této datové struktury.
class(Katan$Věk)
# Chceme-li vybrat určitou proměnnou v rámci data frame, volíme styl zápisu
# ve formátu název_data_frame$název_proměnné. Klávesová zkratka pro dolar
# je AltGr(pravý Alt) + ů, více v lekci Data frame.[1] "numeric"
x <- matrix(c(1, 2, 3, 4, 5, 6, 7, 8, 9), nrow = 3, byrow = TRUE)
# vzorová matice
class(x)[1] "matrix" "array"
Pozorného studenta v tento okamžik možná napadne otázka, zdali a případně jak lze změnit datovou strukturu třeba takového vektoru na data frame či matici? Žádný problém. Využijeme totiž stejného postupu jako při změně datového typu. Zapišme si postupně následující tři řádky příkazů a přitom změňme vektor na matici a poté na data frame.
a <- 1:9
class(a)[1] "integer"
a <- as.matrix(a)
class(a)[1] "matrix" "array"
a <- as.data.frame(a)
class(a)[1] "data.frame"
Jak je vidět, to že například data frame obvykle obsahuje několik sloupců s různými datovými typy ještě neznamená, že je tomu tak vždy. Klidně se může jednat o jeden sloupec čísel podobně jako vektor.
Otázek není nikdy dost, proto si uveďme i tu následující. Jak lze změnit datový typ proměnné (sloupce) v rámci data frame? Podívejme se do modrého boxu.
Pomocí prvního příkazu se nám podaří změnit datový typ u proměnné Pohlaví z character na faktor, se kterým se blíže seznámíme již následující lekci.
class(Katan$Pohlaví)
Katan$Pohlaví <- as.factor(Katan$Pohlaví)
class(Katan$Pohlaví)[1] "character"
[1] "factor"
Ve druhém příkazu najednou změníme datové typy u dvou proměnných (Kouření a Práce).
Katan <- transform(Katan, Kouření = as.factor(Kouření), Práce = as.factor(Práce))
class(Katan$Kouření)
class(Katan$Práce)[1] "factor"
[1] "factor"
Na závěr této lekce se ještě seznámíme s několika užitečnými příkazy. Tím prvním bude příkaz ls(), pomocí kterého vypíšeme do konzole názvy všech proměnných, jež máme v R vytvořené.
ls()Příkaz ls() lze využít i pro smazání veškerých aktuálně vytvořených proměnných v RStudiu.
rm(list = ls())
# Příkaz odstraní všechny proměnné z relace R (samotný
# pokyn list = ls() vytvoří proměnnou list, jejíž součástí
# budou všechny ostatní proměnné v databázi).Mnohem častěji však budeme chtít smazat pouze jednu z proměnných, kterou máme v R vytvořenou. K tomu využijeme příkaz rm(), se kterým jsme se seznámili již v minulé kapitole. Příkaz rm() lze využít nejen pro mazání vektorů, ale i vícerozměrných dat (data frame, matice, seznam, pole). Pozor však na to, že tento příkaz nelze využít pro mazání jednotlivých proměnných v rámci databáze (příkaz ve formátu rm(Katan$Partie) nefunguje). Zjednodušeně řečeno příkaz rm() lze použít pro smazání jakékoli proměnné, jejíž název vidíte v pravém horním panelu.
Poslední příkaz, který se v této lekci naučíme používat, se nazývá str(). Ten nám pomůže zejména tehdy, chceme-li rychle zjistit datové typy všech proměnných v databázi.
str(Katan)tibble [200 x 9] (S3: tbl_df/tbl/data.frame)
$ Partie : num [1:200] 4 4 3 8 5 6 6 3 3 9 ...
$ Věk : num [1:200] 13 13 14 14 15 15 15 15 15 15 ...
$ Pohlaví : chr [1:200] "žena" "žena" "muž" "muž" ...
$ Vzdělání: chr [1:200] "ZŠ" "ZŠ" "ZŠ" "ZŠ" ...
$ Kolej : chr [1:200] "ne" "ne" "ne" "ne" ...
$ Práce : chr [1:200] "nepracuje" "nepracuje" "nepracuje" "nepracuje" ...
$ Kouření : chr [1:200] "nekouří" "nekouří" "nekouří" "nekouří" ...
$ Klub : chr [1:200] "nečlen" "nečlen" "člen" "nečlen" ...
$ Děti : num [1:200] 0 0 0 0 0 0 0 0 0 0 ...
Příklad 5
Uložte do svého počítače databázi LungCapData a zjistěte, zdali se jedná o data frame.
Příklad 6
Zjistěte datový typ proměnné Smoke v databázi LungCapData a proměnné Vzdělání v databázi Katan.
Příklad 7
Vytvořte vektor s hodnotami jedna až deset a změňte ho na data frame.
Faktory jsou textové proměnné, které slouží k uchovávání kategoriálních proměnných. Kategoriální proměnné mohou být buď ordinální (záleží na pořadí, např. u hodnocení kvality jídel ve školní jídelně: “nepoživatelné”, “poživatelné”, “s trochou fantazie i chutná”) nebo neordinální (nezáleží na pořadí, např. pohlaví, otázka kouření (viz Guadalajara a seriál Narcos: Mexico) atd.).
Textové popisky u kategoriálních proměnných lze samozřejmě nahradit celými čísly: např. muž bude 0 a žena 1 či “nepoživatelné” jídlo bude 0, “poživatelné” 1 a “s trochou fantazie i chutná” 2. Toto řešení by nám však přineslo více problémů nežli užitku. Hned ten první problém spočívá v tom, zdali nezapomeneme, že zrovna muž je nula a žena je jednička.
Další potíž tkví v tom, že ačkoliv vám v jídelně včera možná trochu chutnalo (“s trochou fantazie i chutná”, 2), nelze říct, že vám chutnalo dvakrát lépe než včera, kdy jste jídlo ohodnotili jako “poživatelné” (číslo 1, už jen tato hodnota je silně zavádějící). Proto tu máme faktory, které naše problémy vyřeší. Faktory totiž dávají jednotlivým hodnotám v proměnné tzv. nálepky (kouří, nekouří), které sdělují jejich význam.
Jak takovou proměnnou typu faktor vytvořit se naučíme až v příští kapitole, nyní si pouze ve stručnosti ukážeme, jak pracovat s již existujícím faktorem v data frame. Pojďme se znovu podívat na naši oblíbenou databázi Katan, u které například víme, že proměnná Pohlaví by měla být typickým zástupcem faktoru (kategoriální proměnné). Jaké jsou její úrovně?
levels(Katan$Pohlaví) NULL
Že vám příkaz nefunguje a hlásí Null? Zkuste tento.
class(Katan$Pohlaví) [1] "character"
Byl váš výsledek character a nikoliv factor? Dávejte si vždy pozor, s jakým datovým typem pracujete. U značné části příkazů sice může být jedno, jestli je daná proměnná datového typu character či factor, u některých však nikoliv (budete na ně vždy upozorněni). To samé platí o datových strukturách. Pokud vám proto v budoucnu nebude fungovat určitý příkaz a vy budete skálopevně přesvědčeni, že v něm chybu nemáte, zkuste se podívat na jednotlivé datové typy a struktury, se kterými právě pracujete. Mnohdy totiž poznáte, že právě zde je zakopaný pes. Vraťme se však zpět k faktorům a k příkazu levels(), který nám v tuto chvíli již funguje.
Katan$Pohlaví <- as.factor(Katan$Pohlaví)
levels(Katan$Pohlaví) [1] "muž" "žena"
Co když ale budeme chtít muže a ženy přejmenovat na anglické ekvivalenty male a female? Použijeme následující pokyn.
levels(Katan$Pohlaví) <- c("male", "female")
# Pozor na pořadí, ve kterém hodnoty udáváte.
# Srovnejte s výše uvedeným příkazem levels(Katan$Pohlaví)
# a jeho výstupem [1] "muž" "žena".
levels(Katan$Pohlaví) [1] "male" "female"
A to je na úvod k faktorům vše. To nejdůležitější nás nicméně teprve čeká. Tím se stane samotná tvorba faktorových proměnných pomocí příkazů cut(třetí kapitola), ifelse(čtvrtá kapitola) a if_else(šestá kapitola). Je se na co těšit.
Příklad 8
Vytvořte faktory z proměnných Vzdělání a Pohlaví.
Je doopravdy nutné matice blíže představovat, či je to pro vás španělská (mexická) vesnice? Pokud jste se v hodinách matematiky alespoň několikrát omylem vzbudili a pamatujete si přinejmenším obdélníkový nebo čtvercový vzhled matic plný čísel, bude vám tato znalost naprosto stačit. Pokud však absolutně netušíte, o čem tu je řeč, podívejte se třeba na krátké video na YouTube. Pro lepší přehled (a posílení středoškolských znalostí) se vám jeho zhlédnutí bude jistě hodit.
Dále ještě doplním, že značnou část příkazů, které si nyní u matic ukážeme, budeme používat i pro data frame. Není divu. Jediný rozdíl mezi maticemi a data frame je totiž ten, že matice se skládají pouze z jednoho datového typu a data frame z více datových typů (obsahují například sloupce s textovými popisky, poté sloupce s čísly, faktory atd.).
Jistě v tuto chvíli přemýšlíte nad otázkou, k čemu mi jsou matice vlastně dobré? Abych byl upřímný, je-li vaším hlavním cílem pracovat s datovými tabulkami (data frame), znalosti z tvorby matic vám nebudou až na drobné výjimky užitečné. Z tohoto důvodu si rozdělíme lekci na dvě části. První z nich se bude zabývat příkazy zaměřenými čistě na tvorbu matic a ta druhá na práci s nimi, která však bude užitečná i pro data frame.
Tvorba matic
První příkaz, který si tu ukážeme, si klade za cíl vytvořit jednotkovou matici. Jediným parametrem tohoto příkazu je číslice uvnitř závorky, jež označuje počet řádků (sloupců) této matice.
diag(3) [,1] [,2] [,3]
[1,] 1 0 0
[2,] 0 1 0
[3,] 0 0 1
Chceme-li však vytvořit složitější matici, než byla ta předchozí, využijeme příkazu matrix s parametry nrow a byrow.
matice <- matrix(c(1, 2, 3, 4, 5, 6, 7, 8, 9), nrow = 3, byrow = TRUE)
# byrow = TRUE znamená, že čísla 1 až 9 jdou postupně po řádcích,
# FALSE znamená, že čísla jdou po sloupcích. Pomocí transpozice
# matice lze její rozložení změnit i u již existující matice
# t(matice). Příkaz t() lze teoreticky využít i pro data frame. [,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
Po vytvoření matice si můžeme zobrazit její diagonálu pomocí příkazu diag() a tu třeba následně uložit do proměnné Diagonála.
Diagonála <- diag(matice)[1] 1 5 9
Matici lze velice jednoduše vytvořit i z vektoru a to tím, mu určíme počet řádků a sloupců pomocí příkazu dim().
matice_z_vektoru <- 1:12
class(matice_z_vektoru) # příkaz class() nám u vektoru zobrazí jeho datový typ
dim(matice_z_vektoru) <- c(3, 4)
class(matice_z_vektoru) [1] 1 2 3 4 5 6 7 8 9 10 11 12
[1] "integer"
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
[1] "matrix" "array"
Na závěr se ponořme trochu do matematiky. Zkusme si například výše uvedenou matici vynásobit dvěma.
matice <- matrix(1:12, nrow = 3, byrow = FALSE)
matice2 <- matice*2 [,1] [,2] [,3] [,4]
[1,] 2 8 14 20
[2,] 4 10 16 22
[3,] 6 12 18 24
Pokud bychom chtěli vynásobit matici maticí po složkách, použili bychom opět prostý operátor násobení. V případě maticového násobení však budeme muset využít operátor %*%. Přitom si dávejte pozor, aby oba činitelé byli odpovídajících rozměrů (vnitřní rozměry matic musí být shodné). Ukažme si vše na následujících příkladech.
# násobení po složkách
A <- matrix(c(1, 2, 3, 4, 5, 6), nrow = 3, byrow = TRUE)
B <- matrix(c(1, 2, 3, 4, 5, 6), nrow = 3, byrow = TRUE)
výsledek <- A*B
# maticové násobení
A <- matrix(c(1, 2, 3, 4, 5, 6), nrow = 3, byrow = TRUE)
B <- matrix(c(1, 2, 3, 4, 5, 6), nrow = 2, byrow = TRUE)
výsledek <- A%*%B[1] "matice A"
[,1] [,2]
[1,] 1 2
[2,] 3 4
[3,] 5 6
[1] "matice B"
[,1] [,2]
[1,] 1 2
[2,] 3 4
[3,] 5 6
[1] "výsledek <- A*B"
[,1] [,2]
[1,] 1 4
[2,] 9 16
[3,] 25 36
[1] "matice A"
[,1] [,2]
[1,] 1 2
[2,] 3 4
[3,] 5 6
[1] "matice B"
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[1] "výsledek <- A%*%B"
[,1] [,2] [,3]
[1,] 9 12 15
[2,] 19 26 33
[3,] 29 40 51
Práce s maticemi (a data frame)
Vytvářet matice není složité. Pojďme si proto vyzkoušet další příkazy, které nám práci s nimi obohatí. Začněme tím, že si pozměníme názvy sloupců. Před tím si však vytvořme vzorovou matici, se kterou budeme pracovat.
# matice pro následující příklady
matice <- matrix(c(1, 2, 3, 4, 5, 6, 7, 8, 9), nrow = 3, byrow = TRUE)colnames(matice) <- c("C1", "C2", "C3")
# lze použít i pro data frame C1 C2 C3
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
Pokud ve výše uvedeném příkazu použijete méně názvů, než obsahuje matice sloupců, ohlásí se vám následující chyba.
colnames(matice) <- c("C1", "C2") U data frame se však na rozdíl od matic error neohlásí. Nepřejmenované sloupce nicméně zůstanou beze jména, i když před tím svůj název měly. Ukažme si to na příkladu naší databáze Katan.
colnames(Katan) <- c("C1", "C2", "C3")# A tibble: 6 x 9
C1 C2 C3 `` `` `` `` `` ``
<dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <dbl>
1 4 13 žena ZŠ ne nepracuje nekouří nečlen 0
2 4 13 žena ZŠ ne nepracuje nekouří nečlen 0
3 3 14 muž ZŠ ne nepracuje nekouří člen 0
4 8 14 muž ZŠ ne nepracuje nekouří nečlen 0
5 5 15 muž ZŠ ne nepracuje nekouří člen 0
6 6 15 muž ZŠ ne nepracuje nekouří člen 0
Máme-li naši matici (data frame) pojmenovanou dle našich potřeb (jak u data frame přejmenovat pouze jeden sloupec si ukážeme v příští lekci), můžeme si nechat do konzole vypsat veškeré názvy sloupců pomocí samotného příkazu colnames() s názvem matice uvnitř závorky.
colnames(matice) # lze použít i pro data frame[1] "C1" "C2" "C3"
U matic se nám v teoretické rovině může ve výjimečných případech hodit přejmenovat i samotné řádky. K tomu bude sloužit obdobný příkaz rownames().
rownames(matice) <- c("R1", "R2", "R3")
# totožná problematika jako u výše diskutovaného příkazu colnames
# lze použít i pro data frame [,1] [,2] [,3]
R1 1 2 3
R2 4 5 6
R3 7 8 9
Stejně jako u colnames(), tak i pomocí rownames() si můžeme nechat vypsat do konzole názvy jednotlivých řádků (jsou-li ovšem přejmenovány z původního číselného označení, v opačném případě se nám totiž ozve výstup NULL). Přejmenovávat řádky u matic však povětšinou nedává žádný smysl a u data frame už vůbec ne. Veškeré hodnoty je totiž vždy lépe mít uložené jako samostatný sloupec, se kterým lze pracovat. Z tohoto důvodu je nejpraktičtější ponechat automatické číselné označení řádků jak u matic, tak u data frame.
rownames(matice) <- c("R1", "R2", "R3")
# lze použít i pro data frame[1] "R1" "R2" "R3"
Pracujeme-li s rozsáhlou maticí či data frame, bude nezřídka kdy velice užitečné zobrazit pouze horní nebo dolní část takovéto databáze. Představte si například, že databáze obsahuje milion řádků a vaším cílem je získat pouze obecný přehled o datech a jejich struktuře. Pro takový případ tu jsou připraveny příkazy head() a tail().
# po zbytek této lekce budeme pracovat s následující maticí
matice <- matrix(1:30, nrow = 10, byrow = TRUE) [,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
[4,] 10 11 12
[5,] 13 14 15
[6,] 16 17 18
[7,] 19 20 21
[8,] 22 23 24
[9,] 25 26 27
[10,] 28 29 30
head(matice)
# příkaz zobrazí hodnoty v prvních šesti řádcích matice
# lze použít i pro data frame [,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
[4,] 10 11 12
[5,] 13 14 15
[6,] 16 17 18
head(matice, n = 2)
# příkaz pomocí parametru n zobrazí první dva řádky matice
# lze použít i pro data frame [,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
tail(matice)
# příkaz zobrazí hodnoty v posledních šesti řádcích matice
# lze použít i pro data frame [,1] [,2] [,3]
[5,] 13 14 15
[6,] 16 17 18
[7,] 19 20 21
[8,] 22 23 24
[9,] 25 26 27
[10,] 28 29 30
tail(matice, n = 2)
# příkaz pomocí parametru n zobrazí poslední dva řádky matice
# lze použít i pro data frame [,1] [,2] [,3]
[9,] 25 26 27
[10,] 28 29 30
S výše zobrazenými příkazy úzce souvisí i ty následující, které nám sdělí údaje o počtu sloupců a řádků matice či data frame.
ncol(matice)
# příkaz zobrazí počet sloupců matice
# lze použít i pro data frame[1] 3
nrow(matice)
# příkaz zobrazí počet řádků matice
# lze použít i pro data frame[1] 10
dim(matice)
# příkaz zobrazí počet řádků a sloupců matice
# lze použít i pro data frame[1] 10 3
Poslední příkaz, který si tu ukážeme, nese název length(). Jak již název napovídá, bude opět označovat délku matice. Příkaz length() lze nicméně použít nejen pro matice a data frame, ale i pro vektory či jednotlivé proměnné data frame (viz příklady k procvičení z minulé kapitoly, Barcelona). Zatímco však u matic označuje počet všech prvků matice (počet řádků * počet sloupců), u data frame označuje pouze počet sloupců. U vektorů a jednotlivých proměnných data frame naopak zobrazuje obdobně jako u matic počet jejich prvků. Ukažme si všechny varianty příkazu length() postupně na následujících čtyřech příkladech, s čímž opustíme Mexiko.
# vektor
jména <- c("Jakub", "David")
length(jména)[1] 2
# matice
matice <- matrix(1:30, nrow = 10, byrow = TRUE)
length(matice)[1] 30
# data frame
length(Katan)[1] 9
# sloupec (proměnná data frame)
length(Katan$Partie)[1] 200
Příklad 9
Vytvořte matici s čtyřmi řadami a sloupci, která bude obsahovat hodnoty 1, 3, 5 atd. až 31. Následně vytvořte druhou matici, která bude obsahovat hodnoty 1, 6, 11 atd. až 76. Tyto matice poté vynásobte jak po složkách, tak i pomocí maticového násobení.
Příklad 10
Z databáze Katan zobrazte pouze prvních deset řádků a ty následně uložte do nové proměnné Katan2.
Příklad 11
Vytvořte list, který bude obsahovat dva objekty. První z nich bude nákup1 = c("jablko", "hruška", "pomeranč") a druhý z nich nákup2 = c("sýr", "chleba", "mozzarella", "houska", "máslo"). Následně pomocí příkazu lengths() zjistěte počty hodnot v obou objektech listu zároveň. Prosím, nepleťte si length() a lengths(). Jaký je mezi nimi rozdíl? vyzkoušejte si též příkaz lengths() u data frame (např. Katan nebo LungCapData).
Data frame se pro drtivou většinu uživatel R obvykle stává nejvyužívanější datovou strukturou. Z tohoto důvodu bude tato lekce věnována pouze základním příkazům, jelikož vlastní práci s ním budou věnovány veskrze veškeré následující kapitoly této učebnice. Vítejte v Panamě, v zemi, která nabízí excelentní finanční služby, které se vám jako budoucím programátorům mohou někdy hodit.
Tvorba data frame
Ačkoliv budeme datové tabulky do R nejčastěji stahovat ve formě excelových či textových souborů, pojďme si nejdříve ukázat, jak lze data frame vytvořit přímo v prostředí jazyka R. Následující skript nám vytvoří tabulku o dvou sloupcích po pěti řádcích. Vzhledem však k tomu, že příkaz je již poněkud delší, je mnohem přehlednější ho spustit pomocí skriptu a nikoliv konzole.
knihy <- data.frame(
název = c("Královna Margot", "1984", "Farma zvířat", "Vladař", "Kámen a bolest"),
autor = c("Alexandre Dumas", "Orwell", "Orwell", "Machiavelli", "Schulz")) název autor
1 Královna Margot Alexandre Dumas
2 1984 Orwell
3 Farma zvířat Orwell
4 Vladař Machiavelli
5 Kámen a bolest Schulz
Při tvorbě data frame lze postupovat i tím směrem, že si nejdříve vytvoříme jednotlivé vektory s hodnotami a ty následně spojíme do sebe opět za pomoci příkazu data.frame().
jména <- c("Adam", "Eva", "Petr", "Pavel")
věk <- c(33, 19, 27, 48)
výška <- c(1.81, 1.77, 1.66, 2.03) # pozor na desetinnou tečku
lidé <- data.frame(jména, věk, výška) jména věk výška
1 Adam 33 1.81
2 Eva 19 1.77
3 Petr 27 1.66
4 Pavel 48 2.03
Výběr hodnot z data frame (matice)
Pamatujete si na výběr hodnot z vektoru pomocí hranatých závorek? Při výběru hodnot z data frame respektive matic budeme postupovat velice podobným způsobem. Každý data frame (matice) se skládá z řádků a sloupců, to už jsme snad všichni postřehli. Pokud proto máme na mysli výběr určitých hodnot, musíme jejich pozici definovat v obou těchto směrech. Ukažme si vše na následujících příkladech. Před tím si však prosím načtěte databázi Katan.
Katan[1, 3]
# příkaz zobrazí hodnotu v databázi Katan na 1. řádku a ve 3. sloupci# A tibble: 1 x 1
Pohlaví
<chr>
1 žena
Katan[1:3, 3]
# příkaz zobrazí hodnoty v databázi Katan na 1. až 3. řádku a ve 3. sloupci# A tibble: 3 x 1
Pohlaví
<chr>
1 žena
2 žena
3 muž
Katan[c(1,3), 3]
# příkaz zobrazí hodnoty v databázi Katan na 1. a 3. řádku a ve 3. sloupci# A tibble: 2 x 1
Pohlaví
<chr>
1 žena
2 muž
Katan[1, ]
# příkaz zobrazí hodnoty v databázi Katan na 1. řádku a ve všech sloupcích# A tibble: 1 x 9
Partie Věk Pohlaví Vzdělání Kolej Práce Kouření Klub Děti
<dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <dbl>
1 4 13 žena ZŠ ne nepracuje nekouří nečlen 0
V případě výběru hodnot pomocí hranatých závorek u data frame a matice nesmíme nikdy zapomenout na čárku uvnitř. U vektorů žádná čárka nebyla, jelikož hodnoty tvořily pouze jeden sloupec (jednu dimenzi). Zde však pracujeme s vícerozměrnými databázemi.
Katan[ ,1]
# příkaz zobrazí v databázi Katan všechny řádky prvního sloupce# A tibble: 200 x 1
Partie
<dbl>
1 4
2 4
3 3
4 8
5 5
6 6
7 6
8 3
9 3
10 9
# ... with 190 more rows
Katan[-1, ]
# příkaz zobrazí v databázi Katan všechny hodnoty kromě těch v 1. řádku# A tibble: 199 x 9
Partie Věk Pohlaví Vzdělání Kolej Práce Kouření Klub Děti
<dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <dbl>
1 4 13 žena ZŠ ne nepracuje nekouří nečlen 0
2 3 14 muž ZŠ ne nepracuje nekouří člen 0
3 8 14 muž ZŠ ne nepracuje nekouří nečlen 0
4 5 15 muž ZŠ ne nepracuje nekouří člen 0
5 6 15 muž ZŠ ne nepracuje nekouří člen 0
6 6 15 muž ZŠ ne nepracuje nekouří člen 0
7 3 15 žena ZŠ ne nepracuje nekouří člen 0
8 3 15 žena ZŠ ne nepracuje nekouří člen 0
9 9 15 žena ZŠ ne nepracuje nekouří nečlen 0
10 5 15 muž ZŠ ne nepracuje nekouří nečlen 0
# ... with 189 more rows
Katan[-(1:3), ]
# příkaz zobrazí v databázi Katan všechny hodnoty kromě těch v 1. až 3. řádku# A tibble: 197 x 9
Partie Věk Pohlaví Vzdělání Kolej Práce Kouření Klub Děti
<dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <dbl>
1 8 14 muž ZŠ ne nepracuje nekouří nečlen 0
2 5 15 muž ZŠ ne nepracuje nekouří člen 0
3 6 15 muž ZŠ ne nepracuje nekouří člen 0
4 6 15 muž ZŠ ne nepracuje nekouří člen 0
5 3 15 žena ZŠ ne nepracuje nekouří člen 0
6 3 15 žena ZŠ ne nepracuje nekouří člen 0
7 9 15 žena ZŠ ne nepracuje nekouří nečlen 0
8 5 15 muž ZŠ ne nepracuje nekouří nečlen 0
9 5 16 muž ZŠ ne nepracuje nekouří člen 0
10 3 16 žena ZŠ ne nepracuje nekouří člen 0
# ... with 187 more rows
Katan[1:5, ]
# příkaz zobrazí v databázi Katan hodnoty v 1. až 5. řádku# A tibble: 5 x 9
Partie Věk Pohlaví Vzdělání Kolej Práce Kouření Klub Děti
<dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <dbl>
1 4 13 žena ZŠ ne nepracuje nekouří nečlen 0
2 4 13 žena ZŠ ne nepracuje nekouří nečlen 0
3 3 14 muž ZŠ ne nepracuje nekouří člen 0
4 8 14 muž ZŠ ne nepracuje nekouří nečlen 0
5 5 15 muž ZŠ ne nepracuje nekouří člen 0
Katan[Katan[ , 1] >= 5, ]
# příkaz zobrazí všechny řádky, ve kterých je prvek v prvním sloupci >= 5
# vyzkoušejte, co provede samotný příkaz Katan[ , 1] >= 5# A tibble: 44 x 9
Partie Věk Pohlaví Vzdělání Kolej Práce Kouření Klub Děti
<dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <dbl>
1 8 14 muž ZŠ ne nepracuje nekouří nečlen 0
2 5 15 muž ZŠ ne nepracuje nekouří člen 0
3 6 15 muž ZŠ ne nepracuje nekouří člen 0
4 6 15 muž ZŠ ne nepracuje nekouří člen 0
5 9 15 žena ZŠ ne nepracuje nekouří nečlen 0
6 5 15 muž ZŠ ne nepracuje nekouří nečlen 0
7 5 16 muž ZŠ ne nepracuje nekouří člen 0
8 5 16 žena ZŠ ne nepracuje nekouří nečlen 0
9 7 16 muž ZŠ ne nepracuje nekouří člen 0
10 5 16 muž ZŠ ne nepracuje nekouří člen 0
# ... with 34 more rows
Podobně jako u vektorů, lze i u data frame a matic pomocí příkazu v hranatých závorkách změnit jednotlivé hodnoty.
Katan[1, 1] <- 7# A tibble: 1 x 1
Partie
<dbl>
1 7
Potřebujete změnit ve vašem data frame poněkud více hodnot a nechce se vám kvůli každé změně zapisovat výše uvedený příkaz? Použijte příkaz edit() a budete schopni upravovat soubor (skoro) stejně jednoduše jako v Excelu.
Katan <- edit(Katan)
# příkaz zobrazí tabulku, ve které můžeme jednoduše měnit hodnoty proměnnýchMáme-li rozsáhlý data frame (statisíce až miliony řádků) a vy si přitom chcete určité funkce pouze vyzkoušet (a šetřit čas při náročných a dlouhotrvajících výpočtech), lze pomocí příkazu sample_n() vytvořit náhodný vzorek, který bude obsahovat např. pouze 50 řádků z databáze.
SampleKatan <- sample_n(Katan, 50)Práce s proměnnou v data frame
Prozatím jsme s data frame pracovali povětšinou ve formě celého souboru. Co když ale chceme použít určitou funkci jako např. průměr a s ní operovat pouze v rámci určité proměnné (určitého sloupce)? Možná již trochu tušíte, jelikož si jistě vzpomínáte z počátku této kapitoly na to, kterak jsme zjišťovali datový typ proměnné uvnitř data frame či jak jsme používali příkaz length() v předchozí lekci.
mean(Katan$Věk)
# Příkaz mean(Katan$Věk, trim = 0.1) vypočítá věkový průměr,
# který nebude obsahovat horních a dolních 10 % nejodlehlejších měření.[1] 27.64
V případě, že chceme v rámci databáze vybrat určitou proměnnou pro práci s funkcí, nestačí ji pouze označit jejím jménem. Před název této proměnné je totiž nezbytné zapsat název datového souboru, ze kterého daná proměnná pochází a k němu připojit symbolu dolaru ($). Jinými slovy nelze použít např. příkaz mean(Věk), pokud ovšem nepoužijeme jednu velice šikovnou funkci s názvem attach().
attach(Katan)
# příkaz lze použít pouze u data frame a seznamu
# attach(Katan) zrušíme funkcí detach(Katan)Nyní již můžeme pracovat s názvy proměnných jako by se jednalo o volně stojící vektory. Díky tomu v tuto chvíli můžeme bezstarostně zapsat do konzole příkaz mean(Věk) či jen samotný příkaz Věk, chceme-li vypsat hodnoty této proměnné do konzole.
S funkcí attach() je nicméně nutné pracovat velice opatrně. Může se totiž jednoduše stát, že zapomenete, u které databáze máte zrovna attach() zapnut a to zejména v případě, budete-li pracovat s různými obměnami téže databáze, což se bude stávat velice často. Ve skriptech bych ji nepoužíval vůbec, protože zhoršuje čitelnost a přehlednost takového kódu zejména třetí straně. Pro hrátky v konzoli je však k nezaplacení.
Nyní tu pro vás mám jeden jednoduchý, ale přeci jenom trochu záludný úkol. Představte si, že chcete vybrat desátou hodnotu z proměnné Věk. Jak bude váš příkaz vypadat? Tak jako tento?
Katan[10, 2]# A tibble: 1 x 1
Věk
<dbl>
1 15
Chyba to rozhodně není, ale existuje tu jedno mnohem snazší řešení, které nevyžaduje vědět, že proměnná Věk leží ve druhém sloupci. Stačí si vzpomenout na vektory.
Katan$Věk[10][1] 15
Výběr hodnot z vektorů totiž funguje naprosto stejně jako u jednotlivých proměnných data frame.
Přejmenování a přeskupení proměnných v data frame
Povětšinou budeme pracovat při práci v R s cizími databázemi. Z tohoto důvodu nám občas může pomoci si názvy jednotlivých proměnných přejmenovat dle našeho přání. Ukažme si nejdříve, jak lze současně změnit veškeré názvy sloupců v data frame.
names(Katan) <-
c("Games", "Age", "Gender", "Education", "Dormitory",
"Job", "Smoke", "Club", "Children") # A tibble: 6 x 9
Games Age Gender Education Dormitory Job Smoke Club Children
<dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <dbl>
1 4 13 žena ZŠ ne nepracuje nekouří nečlen 0
2 4 13 žena ZŠ ne nepracuje nekouří nečlen 0
3 3 14 muž ZŠ ne nepracuje nekouří člen 0
4 8 14 muž ZŠ ne nepracuje nekouří nečlen 0
5 5 15 muž ZŠ ne nepracuje nekouří člen 0
6 6 15 muž ZŠ ne nepracuje nekouří člen 0
Pokud bychom uvedli do příkazu méně jmen než obsahuje databáze sloupců, nepřejmenované sloupce budou automaticky přejmenovány na NA - Not Available (viz příkaz colnames() diskutovaný v předchozí lekci). Je-li však naším cílem přejmenovat pouze vybranou proměnnou, použijeme jeden z následujících dvou příkazů. Pomocí nich tu na ukázku změníme název druhého sloupce v databázi Katan na Stáří, respektive se nám podaří přepsat název proměnné Kouření na Milovník nikotinu.
colnames(Katan)[2] <- "Stáří"
# příkaz změní název druhého sloupce v databázi Katan na Stáří# A tibble: 6 x 9
Partie Stáří Pohlaví Vzdělání Kolej Práce Kouření Klub Děti
<dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <dbl>
1 4 13 žena ZŠ ne nepracuje nekouří nečlen 0
2 4 13 žena ZŠ ne nepracuje nekouří nečlen 0
3 3 14 muž ZŠ ne nepracuje nekouří člen 0
4 8 14 muž ZŠ ne nepracuje nekouří nečlen 0
5 5 15 muž ZŠ ne nepracuje nekouří člen 0
6 6 15 muž ZŠ ne nepracuje nekouří člen 0
names(Katan)[names(Katan) == "Kouření"] <- "Milovník_nikotinu"
# Příkaz změní název sloupce Kouření na Milovník_nikotinu.
# Dávejte si pozor na to, že před tento příkaz nepíšeme
# název nové proměnné, jako například Katan <- names(...# A tibble: 6 x 9
Partie Věk Pohlaví Vzdělání Kolej Práce Milovník_nikotinu Klub Děti
<dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <dbl>
1 4 13 žena ZŠ ne nepracuje nekouří nečlen 0
2 4 13 žena ZŠ ne nepracuje nekouří nečlen 0
3 3 14 muž ZŠ ne nepracuje nekouří člen 0
4 8 14 muž ZŠ ne nepracuje nekouří nečlen 0
5 5 15 muž ZŠ ne nepracuje nekouří člen 0
6 6 15 muž ZŠ ne nepracuje nekouří člen 0
Zajímá vás, co dokáže samostatný příkaz names()? Vyzkoušejme si ho. Vypíše nám názvy všech proměnných v databázi.
names(Katan)[1] "Partie" "Věk" "Pohlaví" "Vzdělání" "Kolej" "Práce" "Kouření"
[8] "Klub" "Děti"
Přejmenovat proměnné v data frame již umíme. Co když ale budeme chtít změnit jejich pořadí? Dokázali byste sami přijít na řešení? Jako nápovědu uvedu dvě slova: „hranaté závorky“. Vaším úkolem bude seřadit proměnné podle následujícího klíče: Věk, Pohlaví, Vzdělání, Děti, Práce, Kolej, Kouření, Partie a Klub.
Katan <- Katan[ , c(2, 3, 4, 9, 6, 5, 7, 1, 8)]# A tibble: 200 x 9
Věk Pohlaví Vzdělání Děti Práce Kolej Kouření Partie Klub
<dbl> <chr> <chr> <dbl> <chr> <chr> <chr> <dbl> <chr>
1 13 žena ZŠ 0 nepracuje ne nekouří 4 nečlen
2 13 žena ZŠ 0 nepracuje ne nekouří 4 nečlen
3 14 muž ZŠ 0 nepracuje ne nekouří 3 člen
4 14 muž ZŠ 0 nepracuje ne nekouří 8 nečlen
5 15 muž ZŠ 0 nepracuje ne nekouří 5 člen
6 15 muž ZŠ 0 nepracuje ne nekouří 6 člen
7 15 muž ZŠ 0 nepracuje ne nekouří 6 člen
8 15 žena ZŠ 0 nepracuje ne nekouří 3 člen
9 15 žena ZŠ 0 nepracuje ne nekouří 3 člen
10 15 žena ZŠ 0 nepracuje ne nekouří 9 nečlen
# ... with 190 more rows
Nic složitého to nebylo. Co říkáte? Přesuňme se proto ke třetí kapitole do Jižní Ameriky, která nás s data frame seznámí do hloubky. Před tím nicméně nezapomeňte na příklady k procvičení.
Příklad 12
Vytvořte novou databázi, která bude obsahovat pouze 51. až 61. řádek z databáze Katan.
Příklad 13
Vytvořte novou databázi, která bude obsahovat pouze 1. až 10. řádek z databáze Katan pro proměnné Partie, Věk a Pohlaví.
Příklad 14
Vypočítejte průměr hodnot v proměnné Věk bez použití příkazu mean().
Příklad 1
Vytvořte proměnnou s hodnotami od jedné do sta a zjistěte její datový typ. Následně v této proměnné změňte hodnotu na 51. pozici za číslo 51,01. Poté opět zjistěte datový typ proměnné.
x <- 1:100
class(x)
x[51] <- 51.01
class(x)[1] "integer"
[1] "numeric"
Příklad 2
Vytvořte vektor ve tvaru -10, -9,5, -9 až 10, jehož čísla se v tomto pořadí zopakují pětkrát. Jaký datový typ bude nabývat tato proměnná?
x = rep(seq(from = -10, to = 10, by = 1/2), times = 5)
class(x)[1] "numeric"
Příklad 3
Vytvořte náhodný vektor, který bude obsahovat sto hodnot Jakub a David (se stejnou pravděpodobností výskytu) a následně zjistěte jeho datový typ.
JD <- sample(c("Jakub", "David"), size = 100, replace = TRUE)
class(JD)[1] "character"
Příklad 4
Vytvořte proměnnou ve tvaru -100, -98, -96 až 100 a změňte její datový typ na character. Po této změně zkuste tento vektor vynásobit číslem dvě. Je to možné?
x = seq(from = -100, to = 100, by = 2)
x <- as.character(x)
x*2Příklad 5
Uložte do svého počítače databázi LungCapData a zjistěte, zdali se jedná o data frame.
library(readxl)
LungCapData <- read_excel("C:/Users/.../LungCapData.xlsx")
class(LungCapData)[1] "tbl_df" "tbl" "data.frame"
Příklad 6
Zjistěte datový typ proměnné Smoke v databázi LungCapData a proměnné Vzdělání v databázi Katan.
class(LungCapData$Smoke)
class(Katan$Vzdělání)[1] "character"
[1] "character"
Příklad 7
Vytvořte vektor s hodnotami jedna až deset a změňte ho na data frame.
x <- 1:10
x <- as.data.frame(x)
class(x)[1] "data.frame"
Příklad 8
Vytvořte faktory z proměnných Vzdělání a Pohlaví.
Katan <- transform(Katan, Vzdělání = as.factor(Vzdělání), Pohlaví = as.factor(Pohlaví))
class(Katan$Vzdělání)
class(Katan$Pohlaví)[1] "factor"
[1] "factor"
Příklad 9
Vytvořte matici s čtyřmi řadami a sloupci, která bude obsahovat hodnoty 1, 3, 5 atd. až 31. Následně vytvořte druhou matici, která bude obsahovat hodnoty 1, 6, 11 atd. až 76. Tyto matice poté vynásobte jak po složkách, tak i pomocí maticového násobení.
A <- matrix(seq(from = 1, to = 31, by = 2), nrow = 4, byrow = TRUE)
B <- matrix(seq(from = 1, to = 76, by = 5), nrow = 4, byrow = TRUE)
A*B
A%*%B[1] "násobení po složkách"
[,1] [,2] [,3] [,4]
[1,] 1 18 55 112
[2,] 189 286 403 540
[3,] 697 874 1071 1288
[4,] 1525 1782 2059 2356
[1] "maticové násobení"
[,1] [,2] [,3] [,4]
[1,] 696 776 856 936
[2,] 1688 1928 2168 2408
[3,] 2680 3080 3480 3880
[4,] 3672 4232 4792 5352
Příklad 10
Z databáze Katan zobrazte pouze prvních deset řádků a ty následně uložte do nové proměnné Katan2.
Katan2 <- head(Katan, n = 10)
# nebo
Katan2 <- Katan[1:10, ]# A tibble: 10 x 9
Partie Věk Pohlaví Vzdělání Kolej Práce Kouření Klub Děti
<dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <dbl>
1 4 13 žena ZŠ ne nepracuje nekouří nečlen 0
2 4 13 žena ZŠ ne nepracuje nekouří nečlen 0
3 3 14 muž ZŠ ne nepracuje nekouří člen 0
4 8 14 muž ZŠ ne nepracuje nekouří nečlen 0
5 5 15 muž ZŠ ne nepracuje nekouří člen 0
6 6 15 muž ZŠ ne nepracuje nekouří člen 0
7 6 15 muž ZŠ ne nepracuje nekouří člen 0
8 3 15 žena ZŠ ne nepracuje nekouří člen 0
9 3 15 žena ZŠ ne nepracuje nekouří člen 0
10 9 15 žena ZŠ ne nepracuje nekouří nečlen 0
Příklad 11
Vytvořte list, který bude obsahovat dva objekty. První z nich bude nákup1 = c("jablko", "hruška", "pomeranč") a druhý z nich nákup2 = c("sýr", "chleba", "mozzarella", "houska", "máslo"). Následně pomocí příkazu lengths() zjistěte počty hodnot v obou objektech listu zároveň. Prosím, nepleťte si length() a lengths(). Jaký je mezi nimi rozdíl? vyzkoušejte si též příkaz lengths() u data frame (např. Katan nebo LungCapData).
list <- list(nákup1 = c("jablko", "hruška", "pomeranč"),
nákup2 = c("sýr", "chleba", "mozzarella", "houska", "máslo"))
lengths(list)
lengths(Katan)nákup1 nákup2
3 5
Partie Věk Pohlaví Vzdělání Kolej Práce Kouření Klub
200 200 200 200 200 200 200 200
Děti
200
Příklad 12
Vytvořte novou databázi, která bude obsahovat pouze 51. až 61. řádek z databáze Katan.
Katan[51:61, ]# A tibble: 11 x 9
Partie Věk Pohlaví Vzdělání Kolej Práce Kouření Klub Děti
<dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <dbl>
1 3 21 muž SŠ ne nepracuje nekouří nečlen 0
2 3 21 muž SŠ ano nepracuje nekouří člen 0
3 4 21 muž SŠ ano nepracuje nekouří nečlen 0
4 5 21 muž SŠ ano nepracuje nekouří nečlen 0
5 7 21 muž SŠ ano nepracuje nekouří nečlen 0
6 4 21 žena SŠ ano nepracuje nekouří nečlen 0
7 2 21 muž SŠ ano nepracuje nekouří nečlen 0
8 5 21 muž SŠ ano nepracuje nekouří člen 0
9 2 21 muž SŠ ano nepracuje nekouří nečlen 0
10 4 21 žena SŠ ne nepracuje nekouří nečlen 0
11 6 21 žena SŠ ano nepracuje nekouří nečlen 0
Příklad 13
Vytvořte novou databázi, která bude obsahovat pouze 1. až 10. řádek z databáze Katan pro proměnné Partie, Věk a Pohlaví.
Katan[1:10, c(1:3)]# A tibble: 10 x 3
Partie Věk Pohlaví
<dbl> <dbl> <chr>
1 4 13 žena
2 4 13 žena
3 3 14 muž
4 8 14 muž
5 5 15 muž
6 6 15 muž
7 6 15 muž
8 3 15 žena
9 3 15 žena
10 9 15 žena
Příklad 14
Vypočítejte průměr hodnot v proměnné Věk bez použití příkazu mean().
sum(Katan$Věk)/length(Katan$Věk)[1] 27.64